/**
 * this
 */

// 解析器在调用函数时，每次都会向函数内部传递一个隐含的参数
// 这个隐含的参数就是this， this指向的是一个对象
// 这个对象我们称为函数执行的上下文对象
// 根据函数的调用方式不同，this指向不同的对象
function func() {
    console.log(this.name);
}

// 以函数方式调用，this为window
func(); // object window ---> undefined

var obj = {
    name: '孙大圣',
    sayName: func,
    eatSomething: function () {
        console.log(this.name + ' is eating something')
    }
};

// 以对象方式调用，this为创建的对象实例
obj.sayName(); // object object ---> 孙大圣
obj.eatSomething(); // 孙大圣 is eating something



/**
 * arguments: 存储所有传递的实参
 */

// 调用函数时，浏览器每次都会传递两个隐含的参数
// 1. this: 函数上下文对象
// 2. arguments: 封装实参的对象
//    arguments是一个类数组对象，也可以通过索引操作数据以及获取长度
// 3. 如果以函数的形式调用, this指向永远都是window
// 4. 而以方法形式调用时, this指向调用方法的那个对象 -> 又因为对象的原型为Object -> 所以指向object
function def(a = 1, b = 2, c = 3, d) {
    console.log(arguments); // [Arguments] { '0': 12 }
    console.log(arguments[0]); // 12
    console.log(arguments.length); // 1
    // arguments.forEach(function (number) {
    //     console.log(number);
    // });
}

def(12);
